assume cs:code


code segment

;start:
   
;     mov ax, 9

;     mov ax, 8

;     jmp s       ; 向下跳转 标号地址 - jmp指令后的第一个字节胡地址
  
;     mov ax, 8
 
;     mov ax, 9
;     mov ax, 10
;     ; jmp 跳转原理 jmp指令机器码
; s:

;     jmp start       ; 向上跳转 按位取反+1
;     mov bx, 9


;     mov ax, 4c00H
;     int 21H


    mov ax, 4c00H ;3

    int 21H ;2

; 程序可以正常返回吗
start:
    mov ax, 0   ;3
s:
    nop  ;2 s2指令 复制到这了  表示向前跳转10个字节 可以正常退出（IP已指向下一条指令）
    nop ;1
s4:                           ;  /
    mov di, OFFSET s    ;3    ;  /
                          ;  /
    mov si, OFFSET s2 ;3     ; /  
                        ;/
    mov ax, cs:[si] ;3

    mov cs:[di], ax ;3

s0:
    jmp short s   ;2  ; IP +2 然后执行 jmp到s执行  jmp short s1

s1:
    mov ax, 0   ; 3

    int 21H     ; 2

    mov ax, 0   ; 3

s2:
    jmp short s1 ; 2 假设 从这执行（偏移地址寄存器IP已经指向下一段指令）相差10个字节  机器码 EBXX(XX代表字节数)
                ;   这条指令表示向上跳转10个字节， 向上跳转字节数胡二进制按位取反+1
                ;   10 =》 0000 1010
                ;          ------------------
                ;          1111 0101
                ;         +        1
                ;          -----------     ----          
                ;          1111 0110 => F6H = -10D  所以XX = F6H ,所以机器码为EBF6H 表示向上跳转10个字节
    nop ; 1





code ends

end start